Skip to content

chore: Remove deprecated integration tests, add modern samples, update snippets, CI, and docs#4319

Merged
glennawatson merged 16 commits intomainfrom
cleanup/remove-old-integration-tests
Apr 3, 2026
Merged

chore: Remove deprecated integration tests, add modern samples, update snippets, CI, and docs#4319
glennawatson merged 16 commits intomainfrom
cleanup/remove-old-integration-tests

Conversation

@glennawatson
Copy link
Copy Markdown
Contributor

@glennawatson glennawatson commented Apr 2, 2026

What this means for you

Most of this PR is behind-the-scenes cleanup, but there are a few things that directly benefit you:

Updated code snippets -- The ruiprop snippet (available in Visual Studio, Rider, and ReSharper) now generates the modern C# 13 field keyword pattern instead of explicit backing fields:

// Old snippet output
private string _name;
public string Name
{
    get => _name;
    set => this.RaiseAndSetIfChanged(ref _name, value);
}

// New snippet output
public string Name
{
    get;
    set => this.RaiseAndSetIfChanged(ref field, value);
}

New sample applications -- Three self-contained login samples you can use as a starting point or reference for your own projects:

Sample Platform What it demonstrates
ReactiveUI.Samples.Wpf WPF ReactiveUserControl, PasswordBox event marshaling
ReactiveUI.Samples.Winforms WinForms IViewFor with programmatic UI layout
ReactiveUI.Samples.Maui MAUI Shell navigation, ReactiveContentPage, DisplayAlertAsync

Each sample shows RxAppBuilder initialization, WhenActivated lifecycle, Bind/BindCommand, reactive validation (login button disabled until fields are filled), async command execution with cancellation, and proper subscription disposal.

The existing Builder.WpfApp and Builder.BlazorServer examples have also been updated to use the field keyword.

Visual Studio for Mac snippets removed -- The platform has been discontinued by Microsoft. Rider snippets remain available for macOS users.

Updated README -- Examples section added with links to all sample projects. UWP and Tizen removed from the packages table. MAUI section updated with supported .NET 9/10 TFMs.

Updated project docs -- Code of Conduct now references the .NET Foundation Code of Conduct directly. Contributing guidelines simplified to point to the official docs at reactiveui.net/contribute.

Behind the scenes

  • Removed the integrationtests/ directory (UWP, Xamarin.iOS/Android/Mac, net472 WPF/WinForms) -- all targeted deprecated platforms
  • Added CodeQL security scanning via shared actions-common reusable workflow (C#, Actions, JavaScript)
  • Removed obsolete build-samples.yml workflow
  • MAUI sample builds as net10.0 library on CI to work around platform SDK issues

Comment thread src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs Fixed
@codecov
Copy link
Copy Markdown

codecov bot commented Apr 2, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 89.68%. Comparing base (98f534e) to head (839f450).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #4319   +/-   ##
=======================================
  Coverage   89.68%   89.68%           
=======================================
  Files         251      251           
  Lines        9571     9571           
  Branches     1460     1460           
=======================================
  Hits         8584     8584           
  Misses        747      747           
  Partials      240      240           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment thread src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs Fixed
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes the legacy integrationtests/ sample projects targeting deprecated/EOL platforms and replaces them with three modern, .NET 10-based sample apps under src/examples/ that are included in the main reactiveui.slnx solution.

Changes:

  • Removed the entire integrationtests/ tree (projects, solutions, assets, and shared test scaffolding).
  • Added new sample apps: WPF, WinForms, and MAUI login-flow samples under src/examples/.
  • Updated src/reactiveui.slnx to include the new sample projects so they build with the main solution.

Reviewed changes

Copilot reviewed 155 out of 163 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/reactiveui.slnx Adds the new WPF/WinForms/MAUI sample projects to the main solution.
src/examples/ReactiveUI.Samples.Wpf/ReactiveUI.Samples.Wpf.csproj New WPF sample project targeting modern .NET.
src/examples/ReactiveUI.Samples.Wpf/MainWindow.xaml.cs New WPF sample main window code-behind.
src/examples/ReactiveUI.Samples.Wpf/MainWindow.xaml New WPF sample main window XAML hosting the login view.
src/examples/ReactiveUI.Samples.Wpf/LoginViewModel.cs New shared login flow ViewModel for the WPF sample.
src/examples/ReactiveUI.Samples.Wpf/LoginView.xaml.cs New WPF login view with activation/bindings and password marshaling.
src/examples/ReactiveUI.Samples.Wpf/LoginView.xaml New WPF login view layout.
src/examples/ReactiveUI.Samples.Wpf/AssemblyInfo.cs Updates assembly attributes for WPF theme metadata.
src/examples/ReactiveUI.Samples.Wpf/App.xaml.cs WPF sample app startup wiring ReactiveUI builder initialization.
src/examples/ReactiveUI.Samples.Wpf/App.xaml WPF sample application resources.
src/examples/ReactiveUI.Samples.Winforms/ReactiveUI.Samples.Winforms.csproj New WinForms sample project targeting modern .NET.
src/examples/ReactiveUI.Samples.Winforms/Program.cs WinForms sample entry point with builder initialization.
src/examples/ReactiveUI.Samples.Winforms/MainForm.cs WinForms sample main form hosting the login view.
src/examples/ReactiveUI.Samples.Winforms/LoginViewModel.cs New shared login flow ViewModel for the WinForms sample.
src/examples/ReactiveUI.Samples.Winforms/LoginView.cs WinForms login view with activation/bindings and programmatic UI.
src/examples/ReactiveUI.Samples.Maui/ReactiveUI.Samples.Maui.csproj New MAUI sample project targeting modern .NET.
src/examples/ReactiveUI.Samples.Maui/MauiProgram.cs MAUI sample builder initialization using ReactiveUI integration.
src/examples/ReactiveUI.Samples.Maui/LoginViewModel.cs New shared login flow ViewModel for the MAUI sample.
src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs MAUI login page code-behind with activation/bindings and alerts.
src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml MAUI login page XAML layout.
src/examples/ReactiveUI.Samples.Maui/App.xaml.cs MAUI sample app root wiring initial navigation.
src/examples/ReactiveUI.Samples.Maui/App.xaml MAUI app resources (e.g., primary color).
integrationtests/README.md Removed obsolete integrationtests documentation.
integrationtests/IntegrationTests.WPF/UserControlExtensions.cs Removed legacy WPF integration test helper.
integrationtests/IntegrationTests.WPF/Properties/Settings.settings Removed legacy WPF settings file.
integrationtests/IntegrationTests.WPF/Properties/Settings.Designer.cs Removed generated WPF settings designer.
integrationtests/IntegrationTests.WPF/Properties/Resources.resx Removed legacy WPF resources.
integrationtests/IntegrationTests.WPF/Properties/Resources.Designer.cs Removed generated WPF resources designer.
integrationtests/IntegrationTests.WPF/Properties/AssemblyInfo.cs Removed legacy WPF assembly info.
integrationtests/IntegrationTests.WPF/MainWindow.xaml.cs Removed legacy WPF integration app main window.
integrationtests/IntegrationTests.WPF/MainWindow.xaml Removed legacy WPF main window XAML.
integrationtests/IntegrationTests.WPF/LoginControl.xaml.cs Removed legacy WPF login control code-behind.
integrationtests/IntegrationTests.WPF/LoginControl.xaml Removed legacy WPF login control XAML.
integrationtests/IntegrationTests.WPF/IntegrationTests.WPF.csproj Removed legacy WPF integration project.
integrationtests/IntegrationTests.WPF/App.xaml.cs Removed legacy WPF integration app entry.
integrationtests/IntegrationTests.WPF/App.xaml Removed legacy WPF integration app resources.
integrationtests/IntegrationTests.WPF/App.config Removed legacy WPF app config.
integrationtests/IntegrationTests.WPF.sln Removed legacy WPF solution file.
integrationtests/IntegrationTests.WinForms/Properties/Settings.settings Removed legacy WinForms settings file.
integrationtests/IntegrationTests.WinForms/Properties/Settings.Designer.cs Removed generated WinForms settings designer.
integrationtests/IntegrationTests.WinForms/Properties/Resources.resx Removed legacy WinForms resources.
integrationtests/IntegrationTests.WinForms/Properties/Resources.Designer.cs Removed generated WinForms resources designer.
integrationtests/IntegrationTests.WinForms/Properties/AssemblyInfo.cs Removed legacy WinForms assembly info.
integrationtests/IntegrationTests.WinForms/Program.cs Removed legacy WinForms program entry point.
integrationtests/IntegrationTests.WinForms/MainForm.resx Removed legacy WinForms form resources.
integrationtests/IntegrationTests.WinForms/MainForm.Designer.cs Removed legacy WinForms form designer code.
integrationtests/IntegrationTests.WinForms/MainForm.cs Removed legacy WinForms main form code.
integrationtests/IntegrationTests.WinForms/LoginControl.resx Removed legacy WinForms login control resources.
integrationtests/IntegrationTests.WinForms/LoginControl.Designer.cs Removed legacy WinForms login control designer code.
integrationtests/IntegrationTests.WinForms/LoginControl.cs Removed legacy WinForms login control code.
integrationtests/IntegrationTests.WinForms/IntegrationTests.WinForms.csproj Removed legacy WinForms integration project.
integrationtests/IntegrationTests.WinForms/App.config Removed legacy WinForms app config.
integrationtests/IntegrationTests.WinForms.sln Removed legacy WinForms solution file.
integrationtests/IntegrationTests.UWP/Properties/Default.rd.xml Removed legacy UWP runtime directives.
integrationtests/IntegrationTests.UWP/Properties/AssemblyInfo.cs Removed legacy UWP assembly metadata.
integrationtests/IntegrationTests.UWP/Package.appxmanifest Removed legacy UWP app manifest.
integrationtests/IntegrationTests.UWP/MainPage.xaml.cs Removed legacy UWP main page code-behind.
integrationtests/IntegrationTests.UWP/MainPage.xaml Removed legacy UWP main page XAML.
integrationtests/IntegrationTests.UWP/LoginControlBase.cs Removed legacy UWP login control base.
integrationtests/IntegrationTests.UWP/LoginControl.xaml.cs Removed legacy UWP login control code-behind.
integrationtests/IntegrationTests.UWP/LoginControl.xaml Removed legacy UWP login control XAML.
integrationtests/IntegrationTests.UWP/IntegrationTests.UWP.csproj Removed legacy UWP integration project.
integrationtests/IntegrationTests.UWP/Assets/Wide310x150Logo.scale-200.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/StoreLogo.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/Square44x44Logo.scale-200.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/Square150x150Logo.scale-200.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/SplashScreen.scale-200.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/Assets/LockScreenLogo.scale-200.png Removed legacy UWP asset (LFS pointer).
integrationtests/IntegrationTests.UWP/App.xaml.cs Removed legacy UWP application entry code.
integrationtests/IntegrationTests.UWP/App.xaml Removed legacy UWP application XAML.
integrationtests/IntegrationTests.UWP.sln Removed legacy UWP solution file.
integrationtests/IntegrationTests.Shared/LoginViewModel.cs Removed legacy shared integration ViewModel.
integrationtests/IntegrationTests.Shared/IntegrationTests.Shared.csproj Removed legacy shared integration project.
integrationtests/IntegrationTests.Shared.Tests/IntegrationTests.Shared.Tests.csproj Removed legacy shared integration tests project.
integrationtests/IntegrationTests.Shared.Tests/IBuilder.cs Removed legacy test builder interface.
integrationtests/IntegrationTests.Shared.Tests/Features/Login/LoginViewModelTests.cs Removed legacy login ViewModel tests.
integrationtests/IntegrationTests.Shared.Tests/Features/Login/LoginViewModelBuilder.cs Removed legacy test builder implementation.
integrationtests/IntegrationTests.Shared.Tests/BuilderExtensions.cs Removed legacy builder helper extensions.
integrationtests/IntegrationTests.Shared.Tests/app.config Removed legacy test config.
integrationtests/IntegrationTests.Shared.Tests.sln Removed legacy shared tests solution file.
integrationtests/IntegrationTests.Mac/Properties/AssemblyInfo.cs Removed legacy Xamarin.Mac assembly metadata.
integrationtests/IntegrationTests.Mac/MainClass.cs Removed legacy Xamarin.Mac app entry point.
integrationtests/IntegrationTests.Mac/Main.storyboard Removed legacy macOS storyboard UI.
integrationtests/IntegrationTests.Mac/LoginViewController.designer.cs Removed legacy macOS controller designer file.
integrationtests/IntegrationTests.Mac/LoginViewController.cs Removed legacy macOS controller implementation.
integrationtests/IntegrationTests.Mac/IntegrationTests.Mac.csproj Removed legacy Xamarin.Mac project file.
integrationtests/IntegrationTests.Mac/Info.plist Removed legacy macOS app plist.
integrationtests/IntegrationTests.Mac/Entitlements.plist Removed legacy macOS entitlements.
integrationtests/IntegrationTests.Mac/Assets.xcassets/Contents.json Removed legacy macOS assets metadata.
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json Removed legacy macOS icon set metadata.
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png Removed legacy macOS icon (LFS pointer).
integrationtests/IntegrationTests.Mac/AppDelegate.cs Removed legacy macOS app delegate.
integrationtests/IntegrationTests.Mac.sln Removed legacy macOS solution file.
integrationtests/IntegrationTests.iOS/Resources/LaunchScreen.xib Removed legacy Xamarin.iOS launch screen.
integrationtests/IntegrationTests.iOS/Main.storyboard Removed legacy iOS storyboard UI.
integrationtests/IntegrationTests.iOS/LoginViewController.designer.cs Removed legacy iOS controller designer file.
integrationtests/IntegrationTests.iOS/LoginViewController.cs Removed legacy iOS controller implementation.
integrationtests/IntegrationTests.iOS/LaunchScreen.storyboard Removed legacy iOS launch storyboard.
integrationtests/IntegrationTests.iOS/IntegrationTests.iOS.csproj Removed legacy Xamarin.iOS project file.
integrationtests/IntegrationTests.iOS/Info.plist Removed legacy iOS app plist.
integrationtests/IntegrationTests.iOS/Entitlements.plist Removed legacy iOS entitlements.
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png Removed legacy iOS icon (LFS pointer).
integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json Removed legacy iOS icon set metadata.
integrationtests/IntegrationTests.iOS/Application.cs Removed legacy iOS app entry point.
integrationtests/IntegrationTests.iOS/AppDelegate.cs Removed legacy iOS app delegate.
integrationtests/IntegrationTests.iOS.sln Removed legacy iOS solution file.
integrationtests/IntegrationTests.Android/Resources/values/styles.xml Removed legacy Xamarin.Android styles.
integrationtests/IntegrationTests.Android/Resources/values/Strings.xml Removed legacy Xamarin.Android strings.
integrationtests/IntegrationTests.Android/Resources/values/ic_launcher_background.xml Removed legacy Android launcher background color resource.
integrationtests/IntegrationTests.Android/Resources/values/dimens.xml Removed legacy Android dimensions.
integrationtests/IntegrationTests.Android/Resources/values/colors.xml Removed legacy Android colors.
integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher.png Removed legacy Android launcher icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher_round.png Removed legacy Android round icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png Removed legacy Android foreground icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher.png Removed legacy Android launcher icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher_round.png Removed legacy Android round icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png Removed legacy Android foreground icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher.png Removed legacy Android launcher icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher_round.png Removed legacy Android round icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png Removed legacy Android foreground icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher.png Removed legacy Android launcher icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher_round.png Removed legacy Android round icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png Removed legacy Android foreground icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher.png Removed legacy Android launcher icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher_round.png Removed legacy Android round icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png Removed legacy Android foreground icon (LFS pointer).
integrationtests/IntegrationTests.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml Removed legacy adaptive icon XML.
integrationtests/IntegrationTests.Android/Resources/mipmap-anydpi-v26/ic_launcher_round.xml Removed legacy adaptive round icon XML.
integrationtests/IntegrationTests.Android/Resources/menu/menu_main.xml Removed legacy Android menu XML.
integrationtests/IntegrationTests.Android/Resources/layout/content_main.axml Removed legacy Android layout XML.
integrationtests/IntegrationTests.Android/Resources/layout/activity_main.axml Removed legacy Android activity layout XML.
integrationtests/IntegrationTests.Android/Resources/AboutResources.txt Removed legacy Android resource documentation.
integrationtests/IntegrationTests.Android/Properties/AssemblyInfo.cs Removed legacy Xamarin.Android assembly metadata.
integrationtests/IntegrationTests.Android/Properties/AndroidManifest.xml Removed legacy Android manifest.
integrationtests/IntegrationTests.Android/MainActivity.cs Removed legacy Android activity code.
integrationtests/IntegrationTests.Android/IntegrationTests.Android.csproj Removed legacy Xamarin.Android project file.
integrationtests/IntegrationTests.Android/Assets/AboutAssets.txt Removed legacy Android assets documentation.
integrationtests/IntegrationTests.Android.sln Removed legacy Android solution file.
integrationtests/global.json Removed integrationtests SDK extras pinning.
integrationtests/Directory.Build.props Removed integrationtests-specific build configuration.
Files not reviewed (8)
  • integrationtests/IntegrationTests.Mac/LoginViewController.designer.cs: Language not supported
  • integrationtests/IntegrationTests.WPF/Properties/Resources.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.WPF/Properties/Settings.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.WinForms/LoginControl.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.WinForms/MainForm.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.WinForms/Properties/Resources.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.WinForms/Properties/Settings.Designer.cs: Language not supported
  • integrationtests/IntegrationTests.iOS/LoginViewController.designer.cs: Language not supported

Comment thread src/examples/ReactiveUI.Samples.Wpf/LoginViewModel.cs Outdated
Comment thread src/examples/ReactiveUI.Samples.Winforms/LoginViewModel.cs Outdated
Comment thread src/examples/ReactiveUI.Samples.Maui/LoginViewModel.cs Outdated
Comment thread src/examples/ReactiveUI.Samples.Wpf/LoginView.xaml.cs
Comment thread src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs
Comment thread src/examples/ReactiveUI.Samples.Maui/ReactiveUI.Samples.Maui.csproj
Copilot AI added a commit that referenced this pull request Apr 2, 2026
…T-safe FromEventPattern, MAUI TFMs

- Add AppShell.xaml + AppShell.xaml.cs for MAUI Shell navigation
- Update App.xaml.cs to use new AppShell() instead of NavigationPage
- Fix LoginPage.xaml.cs: replace async void Subscribe with SelectMany/FromAsync + instance DisplayAlert
- Fix all three LoginViewModel.cs: Cancel uses Login.IsExecuting as canExecute via Subject<Unit> pattern
- Fix WPF LoginView.xaml.cs: use strongly-typed Observable.FromEventPattern overload
- Fix MAUI csproj: add proper platform-specific MAUI TFMs + OutputType=Exe

Agent-Logs-Url: https://github.com/reactiveui/ReactiveUI/sessions/93dee6e0-8644-4b85-996e-8a19bd5ccf27

Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
glennawatson added a commit that referenced this pull request Apr 2, 2026
…nd MAUI TFMs in sample projects (#4321)

Addresses all open review comments on #4319. The MAUI sample used
`NavigationPage` while calling `Shell.Current?.DisplayAlert(...)`,
guaranteeing a null reference and silent no-op alerts. The `Cancel`
command in all three sample ViewModels was always enabled, contradicting
its doc comment. The WPF `PasswordChanged` binding used reflection-based
`FromEventPattern`, and the MAUI project targeted `net10.0` instead of
deployable platform TFMs.

## MAUI: Shell navigation
- Added `AppShell.xaml` / `AppShell.xaml.cs`; `App.xaml.cs` now creates
`new AppShell()` instead of `new NavigationPage(new LoginPage())`

## MAUI: Alert handling — no more `async void`
Replaced the `async void` subscribe + `Shell.Current?.DisplayAlert`
pattern with a proper Rx chain using the `ContentPage` instance method:
```csharp
ViewModel.Login
    .SelectMany(success => Observable.FromAsync(() =>
        DisplayAlert(
            success ? "Login Successful" : "Login Failed",
            success ? "Welcome!" : "Invalid credentials.",
            "OK")))
    .Subscribe()
    .DisposeWith(d);
```

## All three ViewModels: `Cancel` respects `Login.IsExecuting`
A `Subject<Unit>` breaks the circular dependency (`Login` needs a cancel
signal; `Cancel` needs `Login.IsExecuting`):
```csharp
var cancelSubject = new Subject<Unit>();

Login = ReactiveCommand.CreateFromObservable(
    () => Observable.Return(Password is "secret")
        .Delay(TimeSpan.FromSeconds(1), scheduler)
        .TakeUntil(cancelSubject),
    canLogin, scheduler);

Cancel = ReactiveCommand.Create(
    () => cancelSubject.OnNext(Unit.Default),
    Login.IsExecuting, scheduler);
```

## WPF: AOT-safe `FromEventPattern`
Swapped the reflection overload for the strongly-typed delegate
overload:
```csharp
Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(
    h => Password.PasswordChanged += h,
    h => Password.PasswordChanged -= h)
```

## MAUI csproj: proper platform TFMs
Replaced `<TargetFramework>net10.0</TargetFramework>` with
platform-specific TFMs (`net10.0-android`;
`net10.0-ios`/`net10.0-maccatalyst` on macOS/Windows;
`net10.0-windows10.0.19041.0` on Windows), added
`<OutputType>Exe</OutputType>`, `SupportedOSPlatformVersion`, and
Windows packaging properties.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
Comment thread src/examples/ReactiveUI.Samples.Maui/LoginViewModel.cs Fixed
Comment thread src/examples/ReactiveUI.Samples.Winforms/LoginViewModel.cs Fixed
Comment thread src/examples/ReactiveUI.Samples.Wpf/LoginViewModel.cs Fixed
Comment thread src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs Fixed
@glennawatson glennawatson enabled auto-merge (squash) April 2, 2026 23:36
Comment thread .github/workflows/codeql.yml Fixed
Comment thread .github/workflows/codeql.yml Fixed
auto-merge was automatically disabled April 3, 2026 00:08

Pull request was closed

@glennawatson glennawatson reopened this Apr 3, 2026
@github-advanced-security
Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

glennawatson and others added 7 commits April 3, 2026 11:11
…ples

- Remove integrationtests/ directory containing deprecated platform
  projects targeting UWP, Xamarin.iOS, Xamarin.Android, Xamarin.Mac,
  and legacy net472 WPF/WinForms examples
- Add ReactiveUI.Samples.Wpf targeting net10.0 with RxAppBuilder,
  ReactiveUserControl, WhenActivated, Bind/BindCommand, and manual
  PasswordBox event marshaling
- Add ReactiveUI.Samples.Winforms targeting net10.0 with RxAppBuilder,
  IViewFor, WhenActivated, Bind/BindCommand, and programmatic UI layout
- Add ReactiveUI.Samples.Maui targeting net10.0 with UseReactiveUI
  builder, ReactiveContentPage, WhenActivated, Bind/BindCommand, and
  DisplayAlert for user feedback
- All samples demonstrate a login flow with reactive validation,
  async command execution with cancellation, and proper disposal
- Add new samples to reactiveui.slnx under /Examples/ folder
…nd MAUI TFMs in sample projects (#4321)

Addresses all open review comments on #4319. The MAUI sample used
`NavigationPage` while calling `Shell.Current?.DisplayAlert(...)`,
guaranteeing a null reference and silent no-op alerts. The `Cancel`
command in all three sample ViewModels was always enabled, contradicting
its doc comment. The WPF `PasswordChanged` binding used reflection-based
`FromEventPattern`, and the MAUI project targeted `net10.0` instead of
deployable platform TFMs.

## MAUI: Shell navigation
- Added `AppShell.xaml` / `AppShell.xaml.cs`; `App.xaml.cs` now creates
`new AppShell()` instead of `new NavigationPage(new LoginPage())`

## MAUI: Alert handling — no more `async void`
Replaced the `async void` subscribe + `Shell.Current?.DisplayAlert`
pattern with a proper Rx chain using the `ContentPage` instance method:
```csharp
ViewModel.Login
    .SelectMany(success => Observable.FromAsync(() =>
        DisplayAlert(
            success ? "Login Successful" : "Login Failed",
            success ? "Welcome!" : "Invalid credentials.",
            "OK")))
    .Subscribe()
    .DisposeWith(d);
```

## All three ViewModels: `Cancel` respects `Login.IsExecuting`
A `Subject<Unit>` breaks the circular dependency (`Login` needs a cancel
signal; `Cancel` needs `Login.IsExecuting`):
```csharp
var cancelSubject = new Subject<Unit>();

Login = ReactiveCommand.CreateFromObservable(
    () => Observable.Return(Password is "secret")
        .Delay(TimeSpan.FromSeconds(1), scheduler)
        .TakeUntil(cancelSubject),
    canLogin, scheduler);

Cancel = ReactiveCommand.Create(
    () => cancelSubject.OnNext(Unit.Default),
    Login.IsExecuting, scheduler);
```

## WPF: AOT-safe `FromEventPattern`
Swapped the reflection overload for the strongly-typed delegate
overload:
```csharp
Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(
    h => Password.PasswordChanged += h,
    h => Password.PasswordChanged -= h)
```

## MAUI csproj: proper platform TFMs
Replaced `<TargetFramework>net10.0</TargetFramework>` with
platform-specific TFMs (`net10.0-android`;
`net10.0-ios`/`net10.0-maccatalyst` on macOS/Windows;
`net10.0-windows10.0.19041.0` on Windows), added
`<OutputType>Exe</OutputType>`, `SupportedOSPlatformVersion`, and
Windows packaging properties.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
…ld keyword

- Use Shell.Current.DisplayAlertAsync instead of obsolete DisplayAlert
- Use C# 13 field keyword for auto-properties with RaiseAndSetIfChanged
  across all example ViewModels (Samples, Builder.WpfApp, BlazorServer)
- Remove explicit backing fields where field keyword replaces them
- Add IDisposable to sample LoginViewModels for cancel Subject ownership
- Suppress SA1500/SA1513 for field keyword property initializer syntax
The default CodeQL setup uses build-mode 'none' which results in low
analysis quality for compiled languages (69% call targets, 82% expression
types vs 85% thresholds). Switch to manual build mode with dotnet build
to give CodeQL full compilation context.

Excludes Android and Apple targets since platform SDKs are not available
on the CI runner -- core, WPF, WinForms, WinUI, Blazor, and MAUI (net10.0)
targets provide sufficient coverage for security analysis.
The workflow referenced the deleted integrationtests/ directory.
Samples are now built as part of the main CI build via reactiveui.slnx.
The Android SDK has a Mono.Cecil XARRA7028 bug where
RemoveRegisterAttribute cannot find System.Runtime v10.0.0.0
when building net10.0-android Exe projects on CI Linux runners.

On CI Linux, fall back to net10.0 (library build) so the code
still compiles and is validated. Locally and on CI Windows/macOS,
the full platform TFMs are used including net10.0-android.
@glennawatson glennawatson force-pushed the cleanup/remove-old-integration-tests branch from 7c69530 to 5d16d4d Compare April 3, 2026 00:12
… issues

Android has Cecil/permission bugs, iOS/Mac need Xcode 26.2 which is
not available on CI runners yet. On CI, build as net10.0 library to
validate compilation. Locally, full platform TFMs are used.
@glennawatson glennawatson changed the title Remove deprecated integration tests and add modern platform samples chore: Remove deprecated integration tests and add modern platform samples Apr 3, 2026
- Add Examples section to README with links to all sample projects
- Remove UWP and Tizen from NuGet packages table
- Update MAUI section to list supported .NET 9/10 TFMs
- Update ruiprop snippets (VS, Rider, ReSharper) to use C# 13 field keyword
- Remove Visual Studio for Mac snippets (platform discontinued)
@glennawatson glennawatson changed the title chore: Remove deprecated integration tests and add modern platform samples chore: Remove deprecated integration tests, add modern samples, update snippets and CI Apr 3, 2026
- Code of Conduct now references the .NET Foundation Code of Conduct
  directly, matching the standard adopted by dotnet-foundation/foundation
- Contributing guidelines simplified to reference the official docs at
  reactiveui.net/contribute instead of duplicating outdated instructions
- Removed references to VS 2019, master branch, Windows 10 SDK 17763,
  and other stale content
@glennawatson glennawatson changed the title chore: Remove deprecated integration tests, add modern samples, update snippets and CI chore: Remove deprecated integration tests, add modern samples, update snippets, CI, and docs Apr 3, 2026
Remove 200+ LFS rules for file types that don't exist in this repo
(media, office docs, CAD, game assets, etc.). Keep only rules
relevant to a .NET project: source code normalisation, images,
fonts, archives, compiled binaries, and documents.

Add modern file types: .slnx, .props, .targets, .yml, .yaml,
.editorconfig. Set correct eol for .sln (CRLF) and .sh (LF).
@glennawatson glennawatson enabled auto-merge (squash) April 3, 2026 01:07
…tegration-tests

# Conflicts:
#	integrationtests/IntegrationTests.Android/IntegrationTests.Android.csproj
…platform TFMs

Workload restore now handles previous SDK feature bands correctly,
so the Android/iOS/Mac platform targets should work on CI.
- Create BuilderTestExecutorBase and BuilderTestExecutor in Executors/
  for per-test state reset and core services bootstrap
- Set assembly-level executor via [assembly: TestExecutor<BuilderTestExecutor>]
- Remove builder init from assembly hooks in WinForms, Tests, Testing,
  AOT, and Builder test projects (keep ModeDetector only)
- Add [assembly: TestExecutor<WinFormsTestExecutor>] for WinForms tests
- Add [assembly: TestExecutor<AppBuilderTestExecutor>] for Testing tests
- Remove inline ResetBuilderStateForTests/ResetForTesting calls from
  Builder test methods (executor handles reset)
- Add custom RxAppMigrationTestExecutor for tests needing RxCacheSize/
  RxState/RxSuspension reset
- Add WithBlazorExecutor and WithDrawingExecutor for platform-specific
  builder configuration
- Add global usings for Splat.Builder, TUnit.Core.Executors,
  TUnit.Core.Interfaces to Builder.Tests csproj
@glennawatson glennawatson merged commit 6fb6957 into main Apr 3, 2026
10 checks passed
@glennawatson glennawatson deleted the cleanup/remove-old-integration-tests branch April 3, 2026 04:33
@github-actions
Copy link
Copy Markdown

This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Apr 18, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants